package com.atguigu.gmall.product.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.cache.GmallCache;
import com.atguigu.gmall.product.model.BaseCategoryView;
import com.atguigu.gmall.product.mapper.BaseCategoryViewMapper;
import com.atguigu.gmall.product.service.BaseCategoryViewService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * VIEW 业务实现类
 *
 * @author atguigu
 * @since 2023-07-28
 */
@Service
public class BaseCategoryViewServiceImpl extends ServiceImpl<BaseCategoryViewMapper, BaseCategoryView> implements BaseCategoryViewService {

    /**
     * 查询所有分类，{一级分类：{二级分类：{三级分类}}}
     * 1.查询分类视图得到所有一二三级分类
     * 2.将分类数据放入缓存
     *
     * @return
     */
    @Override
    @GmallCache(prefix = "baseCategoryList:") //baseCategoryList:none:info
    public List<JSONObject> getBaseCategoryList() {
        List<JSONObject> list = new ArrayList<>();
        //1.查询分类视图得到所有分类数据
        List<BaseCategoryView> allList = this.list();

        //2.处理一级分类
        if (!CollectionUtils.isEmpty(allList)) {
            //2.1 对所有分类集合进行分组：按照一级分类ID进行分组 采用stream流进行分组  Map中Key:一级分类ID  Map中Val:当前所有一级分类列表
            Map<Long, List<BaseCategoryView>> category1MapList =
                    allList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

            //2.2 封装一级分类对象-封装一级分类ID以及一级分类名称 既要获取上面Map的key 还要获取val 采用entrySet进行遍历
            for (Map.Entry<Long, List<BaseCategoryView>> category1Entry : category1MapList.entrySet()) {
                //2.2.1 获取一级分类ID以及名称
                Long category1Id = category1Entry.getKey();
                String category1Name = category1Entry.getValue().get(0).getCategory1Name();
                //2.2.2 按照要求构建一级分类对象
                JSONObject category1 = new JSONObject();
                category1.put("categoryId", category1Id);
                category1.put("categoryName", category1Name);
                //3.处理二级分类
                //3.1 将当前一级分类所有列表按照二级分类ID进行分组 Map中Key:二级分类ID  MapValue:当前分类下所有二级分类集合
                Map<Long, List<BaseCategoryView>> category2MapList =
                        category1Entry.getValue().stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));

                //3.2 遍历二级分类Map集合
                List<JSONObject> category2List = new ArrayList<>();
                for (Map.Entry<Long, List<BaseCategoryView>> category2Entry : category2MapList.entrySet()) {
                    //3.2.1 获取二级分类ID跟名称
                    Long category2Id = category2Entry.getKey();
                    String category2Name = category2Entry.getValue().get(0).getCategory2Name();
                    //3.2.2 按照要求构建二级分类对象
                    JSONObject category2 = new JSONObject();
                    category2.put("categoryId", category2Id);
                    category2.put("categoryName", category2Name);

                    //4.处理三级分类
                    //4.1 二级分类集合中包含三级分类 只需要遍历二级分类得到三级分类
                    List<JSONObject> category3List = new ArrayList<>();
                    for (BaseCategoryView baseCategoryView : category2Entry.getValue()) {
                    //4.1.1 遍历构建三级分类对象
                        JSONObject category3 = new JSONObject();
                        category3.put("categoryId", baseCategoryView.getCategory3Id());
                        category3.put("categoryName", baseCategoryView.getCategory3Name());
                        category3List.add(category3);
                    }
                    //4.2 将当前二级分类下三级分类集合放入二级分类对象中“categoryChild”属性
                    category2.put("categoryChild", category3List);
                    category2List.add(category2);
                }
                //3.3 将当前一级分类下二级分类集合 放入到一级分类中“categoryChild”属性中
                category1.put("categoryChild", category2List);
                list.add(category1);
            }

        }
        return list;
    }
}
